package com.takeoff.iot.modbus.common.message;

import com.takeoff.iot.modbus.common.data.ModbusData;

/**
 * 类功能说明：电表通讯信息<br/>
 * 公司名称：华川物联 <br/>
 * 作者：zhengbzh <br/>
 */
public interface ModbusMessage {


	/**
	 * 下发指令数据长度<br>
	 * <table border="1" >
	 * <tr> <th>ADDR_SIZE</th> <th>FUNCTION_SIZE</th> <th>BEGIN_ADDR_SIZE</th> <th>REGISTER_NUM_SIZE</th> <th>CHECKCODE_SIZE</th></tr>
	 * <tr> <th>地址码</th> <th>功能码</th> <th>起始地址</th> <th>寄存器数量</th>  <th>校验位</th> </tr>
	 * </table><br>
	 *
	 * 接收响应或上传数据长度<br>
	 * <table border="1" >
	 * <tr> <th>ADDR_SIZE</th> <th>FUNCTION_SIZE</th> <th>BYTE_SIZE</th> <th>DATA_VALUE</th> <th>CHECKCODE_SIZE</th></tr>
	 * <tr> <th>地址码</th> <th>功能码</th> <th>字节数</th> <th>寄存器数据（长度为前边字节数的值）</th>  <th>校验位</th> </tr>
	 * </table><br>
	 */
	final int ADDR_SIZE = 1, FUNCTION_SIZE = 1, BEGIN_ADDR_SIZE = 2, BYTE_SIZE = 1, REGISTER_NUM_SIZE = 2, CHECKCODE_SIZE = 2;

	/**
	 * 特殊的位置
	 * <table border="1">
	 * 	<tr><td>ADDR_INDEX</td><td>FUNC_INDEX</td></tr>
	 * 	<tr><td>地址码下标</td><td>功能码下标</td></tr>
	 * </table>
	 */
	final int ADDR_INDEX = 0, FUNC_INDEX = 1, READ_DATA_LENGTH_INDEX = 2;
	final int READ = 0x03, WRITE=0x10, OTHERS = 0xFF;

	/**
	 * 返回设备组编码.
	 * @return 设备组编码
	 */
	String deviceGroup();

	/**
	 * 返回消息的指令类型.<br>
	 * @return 指令类型 <br>
	 */
	int command();

	/**
	 * 返回消息的数据对象的字节长度.
	 * @return 数据对象的字节长度
	 */
	int length();

	/**
	 * 返回信息类型.
	 * SEND 发送 <br>
	 * RECV 接收 <br>
	 * @return 信息类型
	 */
	int type();

	/**
	 * 返回消息的数据对象.
	 * @return 数据对象
	 */
	ModbusData data();

	/**
	 * 返回消息的字节数组.
	 * @return 字节数组
	 */
	byte[] toBytes();

//	int addr;
//
//	int funcCode;
//
//	int beginAddr;
//	int registerNum;

}
